//
//  main.swift
//  swift_closure
//
//  Created by chenyh on 2020/12/25.
//

import Foundation

struct MyStruct1 {
    var a: Int8
    var b: Double
    var c: Int64
    var d: Int16
    var e: String?
}
struct MyStruct2 {
    var a: String?
    var b: Double
    var c: Int64  //Int64是8
    var d: Int16
    var e: Int8
    //35
}

struct MyStruct3 {
    var a: String?
    var b: Double
    var c: Int64
    var d: Int16
    var e: Int8
    //40整除8 40 + 35 = 75  0-40-》 35
    var str: MyStruct2
}
//print("MyStruct1")
//print(MemoryLayout<MyStruct1>.size)
//print(MemoryLayout<MyStruct1>.stride)
//print("MyStruct2")
//print(MemoryLayout<MyStruct2>.size)
//print(MemoryLayout<MyStruct2>.stride)
//print("MyStruct3")
//print(MemoryLayout<MyStruct3>.size)
//print(MemoryLayout<MyStruct3>.stride)
//print("String")
//print(MemoryLayout<String>.size)
//print(MemoryLayout<String>.stride)

//print("String?")
//print(MemoryLayout<String?>.size)
//print(MemoryLayout<String?>.stride)
//func makeIncrementer() -> (()->Int) {
//    var  a = 10
//    func incrementer() -> Int {
//        a = a+1
//        return a
//    }
//    return incrementer
//}
////存储格式
//var makeInc = makeIncrementer()
//print(makeInc())
//print(makeInc())
//print(makeInc())
////常量
//print(makeIncrementer()())
//print(makeIncrementer()())
//print(makeIncrementer()())
/**
 内存优化(属性重排)
 我们观察到MyStruct1和MyStruct2的成员属性一样，但是在内存管理上，MyStruct2比MyStruct1利用率更高(白色空白区域更少)。

 MyStruct2中int、short和char 4 + 2 + 1组合，空间利用得更合理。

 苹果会进行属性重排，对属性进行合理排序，尽可能保持保持属性之间的内存连续，减少padding(白色部分，属性之间置空的内存)。
 如果你还记得align16对齐方式，你应该能理解属性重排的好处了
 align16， 是空间换取时间，保障系统在处理对象时能快速存取
 属性重排，保障一个对象尽可能少的占用内存资源。
 
 OC中内存对外是使用16字节对齐方式 对内是使用8字节对齐方式

 */

class HTPerson:NSObject {
    var name: String?
    var nickname: String?
    var age: Int = 0
    var height: Double = 0.0
    var c1: CChar = 0
    var c2: CChar = 0
    convenience init(name: String?,nickname: String?,age: Int,height: Double,c1: CChar,c2: CChar) {
        self.init()
        self.name = name
        self.nickname = nickname
        self.age = age
        self.height = height
        self.c1 = c1
        self.c2 = c2
    }
}

print("HTPerson")
print(MemoryLayout<HTPerson>.size)
print(MemoryLayout<HTPerson>.stride)

let person = HTPerson.init(name: "你好", nickname: "麦咭", age: 32, height: 176, c1: 56, c2: 57)
print(person)
